DAL Create of Insert methode
De Create of Insert methode voor de DAL klasse
Probleem
- We hebben de id van de nieuw toegevoegde rij nodig.
- We willen geen dubbele namen.
We willen feedback geven aan de gebruiker over de insert. Er zijn drie toestanden die we in de gaten moeten houden:
- database foutmelding
- sql foutmelding
- insert gelukt
Design
We gebruiken een try catch om feedback te geven op systeemfouten en SQL server fouten. We interpreteren de retourwaarde van de ExecuteNonQuery
methode. Als parameter geven we een BLL object mee. In ASP.NET MVC is dat vaak het model. Als de naam van de EventCategory
al bestaat zal er een SQL foutmelding gegenereerd worden (-100).
Oplossing
Voeg de Create methode toe in de EventCategory
Dal klasse:
public int Create(Bll.EventCategory bll) { MySqlConnection connection = new MySqlConnection(this.connectionString); // in de CommandText parameter geven we de naam van de stored procedure mee MySqlCommand command = new MySqlCommand("EventCategoryInsert", connection); // zeg aan het command object dat het een stored procedure // zal krijgen en geen SQL Statement command.CommandType = CommandType.StoredProcedure; // voeg de parameters toe die aan de stored procedure doorgegeven moeten worden MySqlParameter pName = new MySqlParameter(); pName.ParameterName = "pName"; pName.DbType = DbType.String; pName.Value = bll.Name; command.Parameters.Add(pName); MySqlParameter pId = new MySqlParameter(); pId.ParameterName = "pId"; pId.DbType = DbType.Int32; // om de out parameter van de stored procedure op te vangen // die stuurt de Id van de nieuw toegevoegde rij terug pId.Direction = ParameterDirection.Output; command.Parameters.Add(pId); Message = "Niets te melden"; // we gaan ervan uit dat het mislukt int result = 0; using (connection) { try { connection.Open(); //Verbinding geslaagd result = command.ExecuteNonQuery(); // we moeten kijken naar de waarde van out parameter // van Insert stored procedure. Als de naam van de // category al bestaat, retourneert de out parameter van // de stored procedure // -1 if ((int)pId.Value == -100) { Message = $"De categorie met de naam {bll.Name} bestaat al!"; result = -100; } else if (result <= 0) { Message = $"De categorie met de naam {bll.Name} kon niet worden geïnserted!"; this.message = "EventCategory is niet geïnserted."; } else { Message = $"De categorie met de naam {bll.Name} is geïnserted!"; result = (int)pId.Value; } } catch (MySqlException e) { this.message = e.Message; } } // 0 of de Id van de nieuwe rij of -100 als de naam van de categorie al bestaat return result; }
Kopiëer die methode in de EventCategory
DAL klasse.
Testen
- Voeg de ReadOne methode toe in IDal:
using System.Collections.Generic; namespace FricFrac.Dal { interface IDal<T> { string Message { get; } int RowCount { get; } List<T> ReadAll(); T ReadOne(int id); int Create(T bll); } }
- Vervolledig de methode
FricFracDalTest
in het bestand Learning.cs:public static void FricFracDalTest() { Console.WriteLine(" Fric-frac DAL test"); FricFrac.Dal.EventCategory dal = new FricFrac.Dal.EventCategory(); List<FricFrac.Bll.EventCategory> list = dal.ReadAll(); Console.WriteLine($" {dal.RowCount} {dal.Message}"); foreach (FricFrac.Bll.EventCategory item in list) Console.WriteLine(" {0} {1}", item.Id, item.Name); FricFrac.Bll.EventCategory bll = new FricFrac.Bll.EventCategory(); bll = dal.ReadOne(4); Console.WriteLine($" {dal.RowCount} {dal.Message}"); bll = dal.ReadOne(200); // we lezen een bestaande categorie in bll = dal.ReadOne(6); Console.WriteLine($" {dal.RowCount} {dal.Message}"); // we proberen deze gevonden categorie weer toe te voegen dal.Create(bll); Console.WriteLine($" {dal.RowCount} {dal.Message}"); // we wijzigen de naam van de categorie bll.Name = "Hackathon Programmeren"; // En proberen die toe te voegen dal.Create(bll); Console.WriteLine($" {dal.RowCount} {dal.Message}"); }
- Roep de methode op in Program.cs:
using System; namespace AdoDotNet { class Program { public static void Main(string[] args) { Console.WriteLine("Leren werken met ADO.NET in .NET Core!"); // Learning.TestMySqlConnector(); // Learning.ReflectPropertiesTryOut(); // Learning.LearnDotNetCoreConfigurationApi(); Learning.FricFracDalTest(); Console.ReadKey(); } } }
- En dat is het resultaat:
2017-09-15 17:14:57